perm filename OBVI.RLS[206,JMC] blob
sn#760757 filedate 1984-07-07 generic text, type T, neo UTF8
Finds obvious moves in sequence solitaire.
COUNT(X,Y) ← IF NULL Y THEN 0
ELSE IF CAR Y = X THEN 1 + COUNT(X,CDR Y)
ELSE COUNT(X,CDR Y);
ELIMALL(X,Y) ← IF NULL Y THEN NIL
ELSE IF MEMBER(CAR Y,X) THEN ELIMALL(X,CDR Y)
ELSE CAR Y . ELIMALL(X,CDR Y);
ELIMDUP X ← IF NULL X THEN NIL ELSE CAR X . ELIMDUP ELIMALL(LIST CAR X,CDR X);
ZORCH N ← IF NULL SP N THEN NIL ELSE LIST CAR SP N;
ZILCH N ← REMAINDER(CAR FP N + N - 1,13) + 1;
Oho! 13 suggests solitaire, and SP means storage pile and FP final pile.
SYMBOLIC PROCEDURE OBVIOUS();
BEGIN SCALAR AVAIL,NAVAIL,FTOP,BURIED,NHAND,MOVES,X;
MOVES ← FMOVES();
IF NULL MOVES THEN RETURN "NO MOVES";
IF NULL CDR MOVES THEN RETURN CAR MOVES;
AVAIL ← APPEND(IF NULL HAND THEN NIL ELSE LIST CAR HAND,
ZORCH 1,ZORCH 2,ZORCH 3,ZORCH 4);
NAVAIL ← ELIMDUP AVAIL;
FTOP ← ELIMALL(LIST 0,LIST(ZILCH 1,ZILCH 2,ZILCH 3,ZILCH 4));
NHAND ← IF NULL HAND THEN NIL ELSE CDR HAND;
BURIED ←APPEND(IF NULL SP 1 THEN NIL ELSE CDR SP 1,
IF NULL SP 2 THEN NIL ELSE CDR SP 2,
IF NULL SP 3 THEN NIL ELSE CDR SP 3,
IF NULL SP 4 THEN NIL ELSE CDR SP 4);
PRINT "FOO1";
LOOP:
IF NULL NAVAIL THEN RETURN NIL;
X ← CAR NAVAIL; NAVAIL ← CDR NAVAIL;
IF COUNT(X,AVAIL) ≠ COUNT(X,FTOP) ∨ COUNT(X,BURIED)≠0 ∨ COUNT(X,NHAND)≠0
THEN GO TO LOOP;
PRINT "FOO2";
J←1;L:IF J>4 THEN GO TO L1; IF
REMAINDER(CAR FP J + J - X,13) = 0 THEN GO TO W1;J←J+1;GO TO L;L1:
PRINT LIST("X=",X,",SP=",SP 1,SP 2,SP 3,SP 4,"NAVAIL=",NAVAIL);
RETURN "INCONSISTENCY 1 IN OBVIOUS";
W1:
PRINT "FOO4";
IF NOT NULL HAND ∧ CAR HAND = X THEN RETURN LIST('HF,J);
PRINT "FOO3";
I←1;LL:IF I>4 THEN GO TO LL1;IF CAR SP I = X THEN RETURN LIST('SF,I,J);
I←I+1;GO TO LL;LL1:
RETURN "INCONSISTENCY 2 IN OBVIOUS";
END;
END;